<?hh
// Copyright 2004-present Facebook. All Rights Reserved.

class Cls1 {}
class Cls2 extends Cls1 {}

enum Enum1 : string {
  VAL1 = 'val1';
  VAL2 = 'val2';
  VAL3 = 'val3';
}

enum Enum2 : int {
  VAL1 = 1;
  VAL2 = 2;
  VAL3 = 3;
}

enum Enum3 : string {
  VAL4 = 'val4';
  VAL5 = 'val5';
  VAL6 = 'val6';
}

enum Enum4 : mixed {
  VAL1 = 1;
  VAL2 = 'val2';
  VAL3 = 3;
}

if (__hhvm_intrinsics\launder_value(true)) {
  include 'redefine1.inc';
} else {
  include 'redefine2.inc';
}

type Alias1 = int;
type Alias2 = string;
type Alias3 = this;
type Alias4 = Cls1;
type Alias5 = Enum1;
type Alias6 = int;
type Alias7 = Enum3;
type Alias8 = mixed;
type Alias9 = Enum4;
type Alias10 = ?mixed;
type Alias11 = ?Enum4;
type Alias12 = ?int;
type Alias13 = ?Enum2;
type Alias14 = ?Cls1;

class A {
  public int $p1;
  public string $p2;
  public bool $p3;
  public double $p4;
  public array $p5;
  public resource $p6;
  public nonnull $p7;
  public num $p8;
  public arraykey $p9;
  public vec $p10;
  public dict $p11;
  public keyset $p12;
  public vec_or_dict $p13;
  public arraylike $p14;
  public varray $p15;
  public darray $p16;
  public varray_or_darray $p17;
  public this $p18;
  public Cls1 $p19;
  public Cls2 $p20;
  public Enum1 $p21;
  public Enum2 $p22;
  public Alias1 $p23;
  public Alias2 $p24;
  public Alias3 $p25;
  public Alias4 $p26;
  public Alias5 $p27;
  public Traversable $p28;
  public $p29;
  public mixed $p30;
  public Enum3 $p31;
  public Alias6 $p32;
  public Alias1 $p33;
  public Alias7 $p34;
  public Enum4 $p35;
  public Alias9 $p36;
  public Enum4 $p37;
  public varray_or_darray $p38;
  public array $p39;
  public array $p40;
  public mixed $p41;
  public ?mixed $p42;
  public Alias10 $p43;
  public ?Alias10 $p44;
  public Alias8 $p45;
  public ?Alias8 $p46;
  public Alias11 $p47;
  public ?Alias11 $p48;
  public ?int $p49;
  public ?int $p50;
  public Alias12 $p51;
  public ?Alias12 $p52;
  public ?Alias1 $p53;
  public Alias12 $p54;
  public ?Alias12 $p55;
  public ?int $p56;
  public ?Alias6 $p57;
  public ?Alias6 $p58;
  public ?Alias6 $p59;
  public ?Alias6 $p60;
  public Alias13 $p61;
  public ?Alias13 $p62;
  public ?Enum2 $p63;
  public ?Enum2 $p64;
  public ?int $p65;
  public Alias13 $p66;
  public ?Alias13 $p67;
  public ?int $p68;
  public ?Cls1 $p69;
  public ?Cls1 $p70;
  public Alias14 $p71;
  public ?Alias14 $p72;
  public ?Alias14 $p73;
  public Alias14 $p74;
  public ?Alias14 $p75;
  public ?Alias4 $p76;
  public ?Alias4 $p77;
  public @int $p78;
  public @?int $p79;
  public int $p80;
  public CondEnum1 $p81;
  public CondAlias $p82;
  public int $p83;
  public CondEnum1 $p84;
  public CondAlias $p85;

  private int $pp1;
  private string $pp2;
  private bool $pp3;
  private double $pp4;
  private array $pp5;
  private resource $pp6;
  private nonnull $pp7;
  private num $pp8;
  private arraykey $pp9;
  private vec $pp10;
  private dict $pp11;
  private keyset $pp12;
  private vec_or_dict $pp13;
  private arraylike $pp14;
  private varray $pp15;
  private darray $pp16;
  private varray_or_darray $pp17;
  private this $pp18;
  private Cls1 $pp19;
  private Cls2 $pp20;
  private Enum1 $pp21;
  private Enum2 $pp22;
  private Alias1 $pp23;
  private Alias2 $pp24;
  private Alias3 $pp25;
  private Alias4 $pp26;
  private Alias5 $pp27;
  private Traversable $pp28;
  private $pp29;
  private mixed $pp30;
  private Enum3 $pp31;
  private Alias6 $pp32;
  private Alias1 $pp33;
  private Alias7 $pp34;
  private Enum4 $pp35;
  private Alias9 $pp36;
  private Enum4 $pp37;
  private varray_or_darray $pp38;
  private array $pp39;
  private array $pp40;
  private mixed $pp41;
  private ?mixed $pp42;
  private Alias10 $pp43;
  private ?Alias10 $pp44;
  private Alias8 $pp45;
  private ?Alias8 $pp46;
  private Alias11 $pp47;
  private ?Alias11 $pp48;
  private ?int $pp49;
  private ?int $pp50;
  private Alias12 $pp51;
  private ?Alias12 $pp52;
  private ?Alias1 $pp53;
  private Alias12 $pp54;
  private ?Alias12 $pp55;
  private ?int $pp56;
  private ?Alias6 $pp57;
  private ?Alias6 $pp58;
  private ?Alias6 $pp59;
  private ?Alias6 $pp60;
  private Alias13 $pp61;
  private ?Alias13 $pp62;
  private ?Enum2 $pp63;
  private ?Enum2 $pp64;
  private ?int $pp65;
  private Alias13 $pp66;
  private ?Alias13 $pp67;
  private ?int $pp68;
  private ?Cls1 $pp69;
  private ?Cls1 $pp70;
  private Alias14 $pp71;
  private ?Alias14 $pp72;
  private ?Alias14 $pp73;
  private Alias14 $pp74;
  private ?Alias14 $pp75;
  private ?Alias4 $pp76;
  private ?Alias4 $pp77;
  private @int $pp78;
  private @?int $pp79;
  private int $pp80;
  private CondEnum1 $pp81;
  private CondAlias $pp82;
  private int $pp83;
  private CondEnum1 $pp84;
  private CondAlias $pp85;

  public static int $s1;
  public static string $s2;
  public static bool $s3;
  public static double $s4;
  public static array $s5;
  public static resource $s6;
  public static nonnull $s7;
  public static num $s8;
  public static arraykey $s9;
  public static vec $s10;
  public static dict $s11;
  public static keyset $s12;
  public static vec_or_dict $s13;
  public static arraylike $s14;
  public static varray $s15;
  public static darray $s16;
  public static varray_or_darray $s17;
  public static this $s18;
  public static Cls1 $s19;
  public static Cls2 $s20;
  public static Enum1 $s21;
  public static Enum2 $s22;
  public static Alias1 $s23;
  public static Alias2 $s24;
  public static Alias3 $s25;
  public static Alias4 $s26;
  public static Alias5 $s27;
  public static Traversable $s28;
  public static $s29;
  public static mixed $s30;
  public static Enum3 $s31;
  public static Alias6 $s32;
  public static Alias1 $s33;
  public static Alias7 $s34;
  public static Enum4 $s35;
  public static Alias9 $s36;
  public static Enum4 $s37;
  public static varray_or_darray $s38;
  public static array $s39;
  public static array $s40;
  public static mixed $s41;
  public static ?mixed $s42;
  public static Alias10 $s43;
  public static ?Alias10 $s44;
  public static Alias8 $s45;
  public static ?Alias8 $s46;
  public static Alias11 $s47;
  public static ?Alias11 $s48;
  public static ?int $s49;
  public static ?int $s50;
  public static Alias12 $s51;
  public static ?Alias12 $s52;
  public static ?Alias1 $s53;
  public static Alias12 $s54;
  public static ?Alias12 $s55;
  public static ?int $s56;
  public static ?Alias6 $s57;
  public static ?Alias6 $s58;
  public static ?Alias6 $s59;
  public static ?Alias6 $s60;
  public static Alias13 $s61;
  public static ?Alias13 $s62;
  public static ?Enum2 $s63;
  public static ?Enum2 $s64;
  public static ?int $s65;
  public static Alias13 $s66;
  public static ?Alias13 $s67;
  public static ?int $s68;
  public static ?Cls1 $s69;
  public static ?Cls1 $s70;
  public static Alias14 $s71;
  public static ?Alias14 $s72;
  public static ?Alias14 $s73;
  public static Alias14 $s74;
  public static ?Alias14 $s75;
  public static ?Alias4 $s76;
  public static ?Alias4 $s77;
  public static @int $s78;
  public static @?int $s79;
  public static int $s80;
  public static CondEnum1 $s81;
  public static CondAlias $s82;
  public static int $s83;
  public static CondEnum1 $s84;
  public static CondAlias $s85;
}

class B extends A {
}

class C extends B {
  public string $p1;
  public int $p2;
  public double $p3;
  public num $p4;
  public arraylike $p5;
  public Cls1 $p6;
  public int $p7;
  public int $p8;
  public string $p9;
  public arraylike $p10;
  public arraylike $p11;
  public arraylike $p12;
  public vec $p13;
  public vec $p14;
  public arraylike $p15;
  public arraylike $p16;
  public arraylike $p17;
  public C $p18;
  public Cls2 $p19;
  public Cls1 $p20;
  public Enum2 $p21;
  public Enum1 $p22;
  public Alias2 $p23;
  public Alias1 $p24;
  public Alias5 $p25;
  public Alias4 $p26;
  public Alias3 $p27;
  public KeyedTraversable $p28;
  public int $p29;
  public string $p30;
  public int $p31;
  public string $p32;
  public Alias2 $p33;
  public Enum2 $p34;
  public int $p35;
  public string $p36;
  public ?Enum4 $p37;
  public vec $p38;
  public arraylike $p39;
  public arraylike $p40;
  public nonnull $p41;
  public ?nonnull $p42;
  public Alias5 $p43;
  public ?Alias5 $p44;
  public Alias3 $p45;
  public ?Alias3 $p46;
  public ?Alias1 $p47;
  public Alias1 $p48;
  public int $p49;
  public ?num $p50;
  public Alias6 $p51;
  public ?Alias3 $p52;
  public Alias1 $p53;
  public ?Alias2 $p54;
  public Alias2 $p55;
  public int $p56;
  public Enum2 $p63;
  public Enum2 $p64;
  public ?arraykey $p65;
  public ?Enum3 $p66;
  public Enum3 $p67;
  public int $p68;
  public Cls1 $p69;
  public ?Cls2 $p70;
  public Cls1 $p71;
  public Alias14 $p72;
  public ?Cls2 $p73;
  public bool $p74;
  public Alias4 $p75;
  public ?Alias3 $p76;
  public Alias3 $p77;
  public int $p78;
  public ?int $p79;
  public ?int $p80;
  public ?CondEnum1 $p81;
  public ?CondAlias $p82;
  public @int $p83;
  public ?@CondEnum1 $p84;
  public ?@CondAlias $p85;

  private string $pp1;
  private int $pp2;
  private double $pp3;
  private num $pp4;
  private arraylike $pp5;
  private Cls1 $pp6;
  private int $pp7;
  private int $pp8;
  private string $pp9;
  private arraylike $pp10;
  private arraylike $pp11;
  private arraylike $pp12;
  private vec $pp13;
  private vec $pp14;
  private arraylike $pp15;
  private arraylike $pp16;
  private arraylike $pp17;
  private C $pp18;
  private Cls2 $pp19;
  private Cls1 $pp20;
  private Enum2 $pp21;
  private Enum1 $pp22;
  private Alias2 $pp23;
  private Alias1 $pp24;
  private Alias5 $pp25;
  private Alias4 $pp26;
  private Alias3 $pp27;
  private KeyedTraversable $pp28;
  private int $pp29;
  private string $pp30;
  private int $pp31;
  private string $pp32;
  private Alias2 $pp33;
  private Enum2 $pp34;
  private arraykey $pp35;
  private arraykey $pp36;
  private arraykey $pp37;
  private vec $pp38;
  private arraylike $pp39;
  private arraylike $pp40;
  private nonnull $pp41;
  private ?nonnull $pp42;
  private Alias5 $pp43;
  private ?Alias5 $pp44;
  private Alias3 $pp45;
  private ?Alias3 $pp46;
  private ?Alias1 $pp47;
  private Alias1 $pp48;
  private int $pp49;
  private ?num $pp50;
  private Alias6 $pp51;
  private ?Alias3 $pp52;
  private Alias1 $pp53;
  private ?Alias2 $pp54;
  private Alias2 $pp55;
  private int $pp56;
  private Enum2 $pp63;
  private Enum2 $pp64;
  private ?arraykey $pp65;
  private ?Enum3 $pp66;
  private Enum3 $pp67;
  private int $pp68;
  private Cls1 $pp69;
  private ?Cls2 $pp70;
  private Cls1 $pp71;
  private Alias14 $pp72;
  private ?Cls2 $pp73;
  private bool $pp74;
  private Alias4 $pp75;
  private ?Alias3 $pp76;
  private Alias3 $pp77;
  private int $pp78;
  private ?int $pp79;
  private ?int $pp80;
  private ?CondEnum1 $pp81;
  private ?CondAlias $pp82;
  private @int $pp83;
  private ?@CondEnum1 $pp84;
  private ?@CondAlias $pp85;

  public static string $s1;
  public static int $s2;
  public static double $s3;
  public static num $s4;
  public static arraylike $s5;
  public static Cls1 $s6;
  public static int $s7;
  public static int $s8;
  public static string $s9;
  public static arraylike $s10;
  public static arraylike $s11;
  public static arraylike $s12;
  public static vec $s13;
  public static vec $s14;
  public static arraylike $s15;
  public static arraylike $s16;
  public static arraylike $s17;
  public static C $s18;
  public static Cls2 $s19;
  public static Cls1 $s20;
  public static Enum2 $s21;
  public static Enum1 $s22;
  public static Alias2 $s23;
  public static Alias1 $s24;
  public static Alias5 $s25;
  public static Alias4 $s26;
  public static Alias3 $s27;
  public static KeyedTraversable $s28;
  public static int $s29;
  public static string $s30;
  public static int $s31;
  public static string $s32;
  public static Alias2 $s33;
  public static Enum2 $s34;
  public static arraykey $s35;
  public static arraykey $s36;
  public static arraykey $s37;
  public static vec $s38;
  public static arraylike $s39;
  public static arraylike $s40;
  public static nonnull $s41;
  public static ?nonnull $s42;
  public static Alias5 $s43;
  public static ?Alias5 $s44;
  public static Alias3 $s45;
  public static ?Alias3 $s46;
  public static ?Alias1 $s47;
  public static Alias1 $s48;
  public static int $s49;
  public static ?num $s50;
  public static Alias6 $s51;
  public static ?Alias3 $s52;
  public static Alias1 $s53;
  public static ?Alias2 $s54;
  public static Alias2 $s55;
  public static int $s56;
  public static Enum2 $s63;
  public static Enum2 $s64;
  public static ?arraykey $s65;
  public static ?Enum3 $s66;
  public static Enum3 $s67;
  public static int $s68;
  public static Cls1 $s69;
  public static ?Cls2 $s70;
  public static Cls1 $s71;
  public static Alias14 $s72;
  public static ?Cls2 $s73;
  public static bool $s74;
  public static Alias4 $s75;
  public static ?Alias3 $s76;
  public static Alias3 $s77;
  public static int $s78;
  public static ?int $s79;
  public static ?int $s80;
  public static ?CondEnum1 $s81;
  public static ?CondAlias $s82;
  public static @int $s83;
  public static ?@CondEnum1 $s84;
  public static ?@CondAlias $s85;

  public static function test() {
    new A();
    new B();
    new C();
  }
}

C::test();
C::test();
echo "DONE\n";
